package com.dzt.trainingmgt.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.dzt.trainingmgt.model.User;

public class UserDAO {

    // 数据库连接信息
    private static final String DB_URL = "jdbc:mysql://localhost:3306/db"; // 数据库URL
    private static final String USER = "gzhu"; // 数据库用户名
    private static final String PASS = "123456"; // 数据库密码

    // 获取数据库连接的方法
    private Connection getConnection() throws SQLException {
        // 使用 DriverManager 获取到数据库的连接
        return DriverManager.getConnection(DB_URL, USER, PASS);
    }

    /**
     * 向数据库中添加一个新用户
     *
     * @param user 要添加的用户对象
     * @throws SQLException 如果与数据库交互时发生错误
     */
    public void createUser(User user) throws SQLException {
        // SQL 插入语句，使用占位符（?）来防止SQL注入
        String sql = "INSERT INTO User (user_account, user_name, user_password, user_role, state) VALUES (?, ?, ?, ?, ?)";
        try (Connection conn = getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建预处理语句
            // 设置预处理语句中的参数值
            pstmt.setInt(1, user.getUser_account());
            pstmt.setString(2, user.getUser_name());
            pstmt.setString(3, user.getUser_password());
            pstmt.setString(4, user.getUser_role());
            pstmt.setString(5, user.getState());
            // 执行插入操作
            pstmt.executeUpdate();
        }
    }

    /**
     * 从数据库中获取所有用户
     *
     * @return 用户列表
     * @throws SQLException 如果与数据库交互时发生错误
     */
    public List<User> getAllUsers() throws SQLException {
        List<User> userList = new ArrayList<>(); // 创建用户列表用于存储查询结果
        String sql = "SELECT * FROM User"; // SQL 查询语句
        try (Connection conn = getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(sql); // 创建预处理语句
             ResultSet rs = pstmt.executeQuery()) { // 执行查询并获取结果集
            // 遍历结果集，为每个记录创建一个新的 User 对象，并添加到列表中
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUser_account(rs.getInt("user_account"));
                user.setUser_name(rs.getString("user_name"));
                user.setUser_password(rs.getString("user_password"));
                user.setUser_role(rs.getString("user_role"));
                user.setState(rs.getString("state"));
                userList.add(user);
            }
        }
        return userList; // 返回用户列表
    }

    /**
     * 更新数据库中已有的用户信息
     *
     * @param user 要更新的用户对象
     * @throws SQLException 如果与数据库交互时发生错误
     */
    public void updateUser(User user) throws SQLException {
        // SQL 更新语句，使用占位符（?）来防止SQL注入
        String sql = "UPDATE User SET user_account=?, user_name=?, user_password=?, user_role=?, state=? WHERE id=?";
        try (Connection conn = getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建预处理语句
            // 设置预处理语句中的参数值
            pstmt.setInt(1, user.getUser_account());
            pstmt.setString(2, user.getUser_name());
            pstmt.setString(3, user.getUser_password());
            pstmt.setString(4, user.getUser_role());
            pstmt.setString(5, user.getState());
            pstmt.setInt(6, user.getId()); // 更新条件：根据用户的 ID 来确定要更新哪条记录
            // 执行更新操作
            pstmt.executeUpdate();
        }
    }

    /**
     * 根据 ID 删除数据库中的用户
     *
     * @param userId 要删除的用户ID
     * @throws SQLException 如果与数据库交互时发生错误
     */
    public void deleteUserById(int userId) throws SQLException {
        // SQL 删除语句，使用占位符（?）来防止SQL注入
        String sql = "DELETE FROM User WHERE id=?";
        try (Connection conn = getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建预处理语句
            // 设置预处理语句中的参数值
            pstmt.setInt(1, userId); // 删除条件：根据用户的 ID 来确定要删除哪条记录
            // 执行删除操作
            pstmt.executeUpdate();
        }
    }

    /**
     * 根据 ID 查找数据库中的用户
     *
     * @param userId 要查找的用户ID
     * @return 匹配的用户对象，如果没有找到则返回 null
     * @throws SQLException 如果与数据库交互时发生错误
     */
    public User getUserById(int userId) throws SQLException {
        // SQL 查询语句，使用占位符（?）来防止SQL注入
        String sql = "SELECT * FROM User WHERE id=?";
        try (Connection conn = getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建预处理语句
            // 设置预处理语句中的参数值
            pstmt.setInt(1, userId); // 查询条件：根据用户的 ID 来确定要查找哪条记录
            try (ResultSet rs = pstmt.executeQuery()) { // 执行查询并获取结果集
                // 如果找到了匹配的记录，则创建一个新的 User 对象并设置其属性
                if (rs.next()) {
                    User user = new User();
                    user.setId(rs.getInt("id"));
                    user.setUser_account(rs.getInt("user_account"));
                    user.setUser_name(rs.getString("user_name"));
                    user.setUser_password(rs.getString("user_password"));
                    user.setUser_role(rs.getString("user_role"));
                    user.setState(rs.getString("state"));
                    return user; // 返回找到的用户对象
                }
            }
        }
        return null; // 如果没有找到指定ID的用户，则返回 null
    }
}